/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;

import Lib.ErreurEnvoiException;
import Lib.ErreurFermetureException;
import Lib.ErreurReceptionException;
import Lib.MessageDemande;
import Lib.MessageReponse;
import Lib.Protocole;
import Lib.TransportInterface;
import java.net.Socket;


/**
 *
 * @author evilmicka
 */
public class ProtocolClient implements ProtocolClientInterface {

    private Socket s = null;
    private TransportInterface tI;

    /**
     * 
     * @param host
     * @param port
     */
    public ProtocolClient(TransportInterface t) {
        this.tI = t;
    }

    /**
     * 
     * @return
     */
    @Override
    public DonneeResultat returnDdeAnnuite() throws ErreurReceptionReponse, ErreurFermetureClientException,
                                            ErreurMontantAnnuiteException, ErreurDemandeException, ErreurMontantPretException,
                                            ErreurNombreAnneeException, ErreurSurTauxException {
        Object o = null;
        MessageReponse mR;
        try {
            o = tI.recevoir();
            mR = (MessageReponse) o;
        } catch (ErreurReceptionException ex) {
            throw new ErreurReceptionReponse();
        } catch (ClassCastException ex) {
            throw new ErreurReceptionReponse();
        }
        if(mR.getCode() != 0)
            traiterCodeErr(mR.getCode());
        DonneeResultat dR = new DonneeResultat(mR.getResultat());
      //  fermerSocket();
        return dR;
    }

    /**
     * return
     */
    @Override
    public DonneeResultat returnDdeNbreAnnee() throws ErreurReceptionReponse, ErreurFermetureClientException, 
                                            ErreurMontantAnnuiteException, ErreurDemandeException, ErreurMontantPretException,
                                            ErreurNombreAnneeException, ErreurSurTauxException {
        Object o;
        MessageReponse mR;
        try {
            o = tI.recevoir();
            mR = (MessageReponse) o;
            

        } catch (ErreurReceptionException ex) {
            throw new ErreurReceptionReponse();
        } catch (ClassCastException ex) {
            throw new ErreurReceptionReponse();
        }
        if(mR.getCode() != 0)
            traiterCodeErr(mR.getCode());
        DonneeResultat dR = new DonneeResultat(mR.getResultat());
       // fermerSocket();
        return dR;
    }

    /**
     * 
     * 
     */
    @Override
    public void fermer() throws ErreurFermetureClientException {
        try {
            tI.fermer();
        } catch (ErreurFermetureException ex) {
            throw new ErreurFermetureClientException();
        }
    }

    /**
     * 
     * @param montantPret
     * @param taux
     * @param nombreAnnee
     */
    @Override
    public void callDemandeAnnuit(double montantPret, double taux, int nombreAnnee) throws ErreurDemandeException, ErreurMontantPretException, ErreurNombreAnneeException, ErreurSurTauxException {


        MessageDemande mD = new MessageDemande();
        mD.setCodeCmd(Protocole.DMD_ANNUIT);
        try {
            tI.envoyer(mD);
        } catch (ErreurEnvoiException ex) {
            throw new ErreurDemandeException();
        }
        mD = new MessageDemande();

        mD.setMontantPret(montantPret);
        try {
            tI.envoyer(mD);
        } catch (ErreurEnvoiException ex) {
            throw new ErreurMontantPretException();
        }

        mD = new MessageDemande();
        mD.setTaux(taux);
        try {
            tI.envoyer(mD);
        } catch (ErreurEnvoiException ex) {
            throw new ErreurSurTauxException();
        }

        mD = new MessageDemande();

        mD.setNombreAnnee(nombreAnnee);
        try {
            tI.envoyer(mD);
        } catch (ErreurEnvoiException ex) {
            throw new ErreurNombreAnneeException();
        }

    }

    /**
     * 
     * @param montantPret
     * @param taux
     * @param annuite
     */
    @Override
    public void callDemandeNbreAnnee(double montantPret, double taux, double annuite) throws ErreurDemandeException, ErreurMontantPretException, ErreurSurTauxException, ErreurMontantAnnuiteException {


        MessageDemande mD = new MessageDemande();
        mD.setCodeCmd(Protocole.DMD_NBR_ANNEES);
        try {
            tI.envoyer(mD);
        } catch (ErreurEnvoiException ex) {
            throw new ErreurDemandeException();
        }
        mD = new MessageDemande();

        mD.setMontantPret(montantPret);
        try {
            tI.envoyer(mD);
        } catch (ErreurEnvoiException ex) {
            throw new ErreurMontantPretException();
        }

        mD = new MessageDemande();
        mD.setTaux(taux);
        try {
            tI.envoyer(mD);
        } catch (ErreurEnvoiException ex) {
            throw new ErreurSurTauxException();
        }

        mD = new MessageDemande();
        mD.setMontantAnnuit(annuite);
        try {
            tI.envoyer(mD);
        } catch (ErreurEnvoiException ex) {
            throw new ErreurMontantAnnuiteException();
        }

    }

    private void traiterCodeErr(int err) throws ErreurMontantAnnuiteException,
                                            ErreurDemandeException, ErreurMontantPretException,
                                            ErreurNombreAnneeException, ErreurSurTauxException {
        switch (err) {
            case Protocole.ERR_MONTANT_ANNUIT:
                throw new ErreurMontantAnnuiteException();
            case Protocole.ERR_DMD_INCONNUE:
                throw new ErreurDemandeException();
            case Protocole.ERR_MONTANT_PRET:
                throw new ErreurMontantPretException();
            case Protocole.ERR_NOMBRE_ANNEE:
                throw new ErreurNombreAnneeException();
            case Protocole.ERR_TAUX_PRET:
                throw new ErreurSurTauxException();
        }
    }
}
